﻿//系统的预定义符号
//#include<stdio.h>
//int main()
//{	
//	fprintf(stdout, "%s\n", __FILE__);//__FILE__代表被编译环境的名字
//	fprintf(stdout, "%d\n", __LINE__);//__LINE__代表此时的行数、
//	fprintf(stdout, "%s\n", __TIME__);//此时运行的时间
//	fprintf(stdout, "%s\n", __DATE__);//此时的日期
//	//fprintf(stdout, "%s\n", __STDC__);输出错误
//	//因为在VS中是不支持ANSI C，即标准C,任何编译器都要在此基础上扩充。若支持，则值为1，否则未定义
//	return 0;
//}//这些都是预定义符号，在预编译时进行预处理

//宏的预编译的使用
//#include<stdio.h>
//#define num(x) x*x
//#define arr(x) (x)*(x)
//int main()
//{
//	int a = 3;
//	int r = num(a + 2);
//	int t = arr(a + 2);
//	//经过预编译后r=a+2*a+2=3+2*3+2=11
//	fprintf(stdout, "%d\n", r);//输出11
//	//因为加上了括号有了优先级，即经过预编译后t=(a+2)*(a+2)=5*5=25
//	fprintf(stdout, "%d\n", t);//输出25
//	return 0;
//}

//'#’的宏使用
//#include<stdio.h>
////在其中用"#n"将会把字符串参数进行替换
//#define num(n) fprintf(stdout,"Hello "#n" World %d\n", n)
////在宏定义参数后面加上format后可输出任意类型，具体格式如下
//#define arr(n,format) fprintf(stdout,"Hello "#n" World "format"\n", n)//"format"会将其值代入
//int main()
//{
//	int abc = 10, bcd = 20;
//	float pp = 1.56f;
//	int pa = 15;
//	num(abc);//用"#参数"将会替换字符串，输出Hello abc World 10
//	num(bcd);//用"#参数"将会替换字符串，输出Hello bcd World 20
//	//用format形式将会输入任何类型的参数
//	arr(pp, "%f");
//	arr(pa, "%d");
//	return 0;
//}

//##在宏中的使用
//#include<stdio.h>
////##可以将两个数进行合并
//#define CTA(a,b) a##b
//int main()
//{
//	int ab = 2023;
//	//在##宏中，CTA(a,b)相当于ab，##是合成符，将分离的片段合成一个片段
//	fprintf(stdout, "%d\n", CTA(a, b));
//	fprintf(stdout, "%d\n", ab);
//	return 0;
//}

//宏的参数的副作用
//#include<stdio.h>
//#define max(x,y) ((x)>(y)?(x):(y))
//int main()
//{
//	int a = 5, b = 6, c = max(a++,b++);
//	//在这里，c先被预处理替换成c=((a++)>(b++)?(a++):(b++))
//	//前缀++,在表达式中先给值再++，所有经过c后a=6,b=8(b经过了两次++)
//	fprintf(stdout, "%d %d %d\n", a, b, c);//输出6 8 7
//	return 0;
//}